解决 RouterOS IoT 网络隔离下 mDNS 和 DLNA 的服务发现问题

随着现代家庭中存在的各种智能家居设备日益增多,对家庭网络安全和隐私保护提出了新的挑战。因此,将家庭局域网络和 IoT 网络进行隔离已成为一种必要手段。然而,隔离网络后,一些依赖 mDNS 和 DLNA 协议的智能设备可能无法正常发现和互联,这就带来了实际应用中的困扰。

前言

在保证家庭网络和 IoT 网络隔离的前提下,如果希望两者之间的设备发现服务仍能正常工作,可以在一台同时连接两个网络的主机上部署中继服务,将一个网络中的发现协议流量转发到另一个网络,实现跨网段通信。

调试工具

在部署中继服务时,可以使用如下工具排查和验证网络中的设备服务。

  • avahi-browse
    • 用来扫描局域网内的 mDNS 服务
    • e.g: avahi-browse -a
  • upnpc
    • 用来扫描局域网内的 DLNA 服务
    • e.g: upnpc -s

IoT 网段隔离

这里贴一下我的 RouterOS 防火墙 filter 配置,附带注释供各位参考:

# 放行所有已放行的连接
;;; accept established,related
chain=forward action=accept connection-state=established,related log=no log-prefix="" 

# 允许主局域网主动访问 IoT 网络
;;; allow LAN access IoT
chain=forward action=accept in-interface=br0 out-interface=iot-br1 log=no log-prefix="" 

# 禁止除了 pppoe-out 之外所有网络访问 IoT 网络
;;; block access IOT
chain=forward action=drop in-interface=!pppoe-out1 out-interface=iot-br1 log=no log-prefix="" 

# 放行来自 IoT 网络主动发起的 DLNA 请求,兼容小米音箱
;;; allow IoT DLNA
chain=forward action=accept protocol=udp in-interface=iot-br1 out-interface=br0 src-port=1900 log=no log-prefix="" 

# 禁止 IoT 网络主动访问除 pppoe-out 之外的所有网络
;;; block IOT access LAN
chain=forward action=drop in-interface=iot-br1 out-interface=!pppoe-out1 log=no log-prefix="" 

mDNS 中继

从 RouterOS 7.x 开始,系统内置了 mDNS Repeater 功能,可直接在需要互通的接口上进行配置:

/ip/dns set mdns-repeat-ifaces=br0,iot-br1

DLNA 中继

DLNA 基于 SSDP 协议,不依赖 mDNS 协议。Github 上有一个开源程序可以用于中继 SSDP、mDNS 流量(本文仅解释看 SSDP 中继):

仓库链接:https://github.com/marjohn56/udpbroadcastrelay

首先 clone 仓库到本地,编译之后将程序复制到 /usr/local/bin目录中:

安装与编译

git clone https://github.com/marjohn56/udpbroadcastrelay.git
cd udpbroadcastrelay
make
sudo cp udpbroadcastrelay /usr/local/bin/

创建 systemd 服务

创建 /etc/systemd/system/udprelay.service文件,便于管理

[Unit]
Description=UDP Broadcast Relay
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/udpbroadcastrelay --id 1 --port 1900 --dev eth1 --dev eth0 --multicast 239.255.255.250 --msearch dial
Restart=always
User=root

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

systemctl enable udprelay
systemctl start udprelay

至此,SSDP 中继已经成功部署,两条隔离网络的 DLNA 设备可互相发现并通信。

Powered By Hexo & Theme Veni